cmake_minimum_required(VERSION 3.25)

project(Tutorial VERSION 1.0)

set(CMAKE_CXX_STANDARD 11)                                   # 设置cpp版本
set(CMAKE_CXX_STANDARD_REQUIRED True)                        # 设置不使用默认版本
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY bin)                      # 设置可执行文件生成位置

# 根据.h.in文件生成.h文件
configure_file(Config/TutorialConfig.h.in Config/TutorialConfig.h)
# 这里设置ON和OFF好像不影响，可以从命令行设置：-DUSE_MYMATH=OFF
option(USE_MYMATH "Use tutorial provided math implementation" ABC)


if(USE_MYMATH)
    add_subdirectory(Tutorial/MathFunctions)         # 添加子文件（可以找到子文件内的库、头文件等）
    list(APPEND EXTRA_LIBS MathFunctions)            # 添加库（EXTRA_LIBS表示可选的库）
    # list(APPEND EXTRA_INCLUDES "${PROJECT_SOURCE_DIR}/MathFunctions")  # 添加头文件（EXTRA_INCLUDES表示可选的头文件）
endif()

add_executable(Tutorial_test Tutorial/src/tutorial.cpp)  # 生成可执行文件
target_link_libraries(Tutorial_test ${EXTRA_LIBS})   # 链接库（好像无所谓动态静态都是这个命令）

# --------------------------------------------->  支持、生成测试

include(CTest)  # 添加CTest模块会自动调用enable_testing()
# 执行命令 ctest -D Experimental 会将测试结果提交到仪表盘(url: https://my.cdash.org/index.php?project=your_project_name)
# 这里具体的url可以设置(在 CTestConfig.cmake 中可修改)
# enable_testing()  # 执行测试程序

add_test(NAME Runs COMMAND Tutorial_test 25)  # 添加测试 NAME(测试名称)  COMMAND(参数)
add_test(NAME Usage COMMAND Tutorial_test)
set_tests_properties(Usage PROPERTIES PASS_REGULAR_EXPRESSION "Usage:.*number")  # 检查测试程序结果合法性s

function(do_test target arg result)  # CMake中的函数  格式如下
    add_test(NAME Comp${arg} COMMAND ${target} ${arg})
    set_tests_properties(Comp${arg} PROPERTIES PASS_REGULAR_EXPRESSION ${result})
endfunction(do_test)

# 一些基于结果的测试
do_test(Tutorial_test 4 "4 is 2")
do_test(Tutorial_test 9 "9 is 3")
do_test(Tutorial_test 5 "5 is 2.236")
do_test(Tutorial_test 7 "7 is 2.645")
do_test(Tutorial_test 25 "25 is 5")
do_test(Tutorial_test -25 "-25 is [-nan|nan|0]")
do_test(Tutorial_test 0.0001 "0.0001 is 0.01")

# --------------------------------------------->  end
# --------------------------------------------->  构建安装程序

include(InstallRequiredSystemLibraries)  # 添加InstallRequiredSystemLibraries模块
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/License.txt")  # 项目许可证和版本信息
set(CPACK_PACKAGE_VERSION_MAJOR "${Tutorial_VERSION_MAJOR}")
set(CPACK_PACKAGE_VERSION_MINOR "${Tutorial_VERSION_MINOR}")
include(CPack)  # 添加CPack模块 它将使用这些变量和一些当前系统的属性去建立一个安装器
# cpack                                     --- 生成二进制版本
# cpack -G ZIP -C Debug                     --- 使用-G来指定生成器
# cpack --config CPackSourceConfig.cmake    --- 创建源代码版本
# make package                              ---

# --------------------------------------------->  end
# --------------------------------------------->  打包调试和发布
# TODO error 看不明白，不懂怎么打包
set(CMAKE_DEBUG_POSTFIX d)
add_library(tutorial_compiler_flags INTERFACE)
add_executable(pack_test Tutorial/src/tutorial.cpp)
set_target_properties(pack_test PROPERTIES DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX})

target_link_libraries(pack_test PUBLIC MathFunctions)


# --------------------------------------------->  end


target_include_directories(Tutorial_test PUBLIC "${PROJECT_BINARY_DIR}") # 设置项目路径，可以使用相对路径包含头文件
target_include_directories(pack_test PUBLIC "${PROJECT_BINARY_DIR}") # 设置项目路径，可以使用相对路径包含头文件

# install(TARGETS Tutorial_test DESTINATION bin)  一些安装命令 将库文件和头文件安装至/usr/local/lib
# install(FILES "${PROJECT_BINARY_DIR}/TutorialConfig.h" DESTINATION include)

